// 文件路径: dbms/service/Request.java
package com.dbms.service;

import java.io.Serializable;

/**
 * 客户端向服务器发送请求的数据传输对象（DTO）。
 * <p>
 * 这个类是可序列化的，意味着它的实例可以被转换成字节流，
 * 以便通过网络在客户端和服务器之间传输。
 * 它封装了客户端请求的所有必要信息，如请求类型和相关数据。
 */
public class Request implements Serializable {
    /**
     * 序列化版本UID，用于确保客户端和服务器使用的类版本兼容。
     */
    private static final long serialVersionUID = 1L; // 用于序列化版本控制

    /**
     * 定义了客户端可以发送的请求类型。
     */
    public enum RequestType {
        /**
         * 用户认证请求。
         */
        AUTHENTICATE,
        /**
         * 执行SQL语句请求。
         */
        EXECUTE_SQL
    }

    /**
     * 当前请求的类型。
     */
    private final RequestType type;
    /**
     * 要执行的SQL语句（仅当类型为EXECUTE_SQL时使用）。
     */
    private String sql;
    /**
     * 用户名（仅当类型为AUTHENTICATE时使用）。
     */
    private String username;
    /**
     * 密码（仅当类型为AUTHENTICATE时使用）。
     */
    private String password;

    /**
     * 用于创建SQL执行请求的构造函数。
     *
     * @param sql 要在服务器上执行的SQL语句。
     */
    public Request(String sql) {
        this.type = RequestType.EXECUTE_SQL;
        this.sql = sql;
    }

    /**
     * 用于创建用户认证请求的构造函数。
     *
     * @param username 用于认证的用户名。
     * @param password 用于认证的密码。
     */
    public Request(String username, String password) {
        this.type = RequestType.AUTHENTICATE;
        this.username = username;
        this.password = password;
    }

    // --- Getters ---
    // 以下是所有字段的公共获取方法。

    /**
     * 获取请求的类型。
     * @return {@link RequestType} 枚举值。
     */
    public RequestType getType() { return type; }
    /**
     * 获取SQL语句。
     * @return SQL字符串，如果不是SQL请求则可能为null。
     */
    public String getSql() { return sql; }
    /**
     * 获取用户名。
     * @return 用户名字符串，如果不是认证请求则可能为null。
     */
    public String getUsername() { return username; }
    /**
     * 获取密码。
     * @return 密码字符串，如果不是认证请求则可能为null。
     */
    public String getPassword() { return password; }
}